﻿package NGUYENVANDOAN.SERIZABLEFILES.EXCERCISES;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;

public class VIEWS extends JFrame {

    private final JPanel contentPane;
    private final JTable jtbLoadData;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    VIEWS frame = new VIEWS();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public VIEWS() {
        setResizable(false);
        setTitle("CHƯƠNG TRÌNH ĐỌC - GHI ĐỐI TƯỢNG XUỐNG FILES");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 541, 436);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JButton btnXemTT = new JButton("Xem Thông Tin");
        btnXemTT.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // B - CÁCH 02:
                JFileChooser objFile = new JFileChooser();
                objFile.setCurrentDirectory(new java.io.File("."));
                objFile.setDialogTitle("Chọn file: ");
                objFile.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                String[] EXTENSION = new String[] { "dat", "tmp" };
                FileNameExtensionFilter filter = new FileNameExtensionFilter("DAT or TMP files", EXTENSION);
                objFile.setFileFilter(filter);
                objFile.setMultiSelectionEnabled(false);

                int returnVal = objFile.showOpenDialog(getParent());
                String ParentPath = "";
                String FileName = "";
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    ParentPath = objFile.getSelectedFile().getParent();
                    FileName = objFile.getSelectedFile().getName();
                }

                // 2. Khai báo và khởi tạo đối tượng Controllers
                CONTROLLERS<List<Student>> objController = new CONTROLLERS<List<Student>>();

                // 3. Mở files *.DAT
                try {
                    List<Student> lisStudent = new ArrayList<Student>();
                    lisStudent = objController.ReadListObjects(ParentPath, FileName);

                    // 3. Định nghĩa ListField
                    List<String> lisField = new ArrayList<String>();
                    lisField.add("RollNo");
                    lisField.add("FullName");
                    lisField.add("Age");
                    lisField.add("Phone");

                    // 4. Duyệt tập bản ghi --> đưa vào Vector
                    List<Vector<String>> lisRow = new ArrayList<Vector<String>>();
                    Vector<String> row = null;
                    Student objStudent = null;
                    for (int i = 0; i < lisStudent.size(); i++) {
                        row = new Vector<String>();
                        objStudent = lisStudent.get(i);
                        row.addElement("" + objStudent.getRollNo());
                        row.addElement("" + objStudent.getFullName());
                        row.addElement("" + objStudent.getAge());
                        row.addElement("" + objStudent.getPhone());
                        lisRow.add(row);
                    }

                    // 5. Khai báo và khởi tạo đối tượng DefaultTableModel
                    DefaultTableModel objDTM = new DefaultTableModel();

                    // 6. Khai báo và khởi tạo đối tượng CONTROLLERS
                    try {
                        objDTM = objController.getModelInfo(lisField, lisRow);
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                    // 7. Hiển thị ra ngoài JTable
                    jtbLoadData.setModel(objDTM);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        });
        btnXemTT.setBackground(Color.ORANGE);
        btnXemTT.setFont(new Font("Cambria", Font.PLAIN, 14));
        btnXemTT.setBounds(10, 11, 146, 37);
        contentPane.add(btnXemTT);

        JButton btnGhiTT = new JButton("Ghi Thông Tin ra files DAT");
        btnGhiTT.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // 1. Khai báo và khởi tạo List<Object>
                List<Student> lisStudent = new ArrayList<Student>();

                // 2. Khai báo các object
                Student sv01 = new Student();
                sv01.setRollNo(1);
                sv01.setFullName("Nguyễn Văn A");
                sv01.setAge(100);
                sv01.setPhone("0988888");

                Student sv02 = new Student();
                sv02.setRollNo(2);
                sv02.setFullName("Hoàng Văn B");
                sv02.setAge(200);
                sv02.setPhone("098999999");

                lisStudent.add(sv01);
                lisStudent.add(sv02);

                // 1. Cung cấp cho người dùng tiện ích lựa chọn vị trí lưu files
                JFileChooser objFile = new JFileChooser();
                objFile.setCurrentDirectory(new java.io.File("."));
                objFile.setDialogTitle("Chọn file: ");
                objFile.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                String[] EXTENSION = new String[] { "dat", "tmp" };
                FileNameExtensionFilter filter = new FileNameExtensionFilter("DAT or TMP files", EXTENSION);
                objFile.setFileFilter(filter);
                objFile.setMultiSelectionEnabled(false);

                int returnVal = objFile.showSaveDialog(getParent());
                String ParentPath = "";
                String FileName = "";
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    ParentPath = objFile.getSelectedFile().getParent();
                    FileName = objFile.getSelectedFile().getName();
                }

                // 2. Khai báo và khởi tạo đối tượng Controllers
                CONTROLLERS<List<Student>> objController = new CONTROLLERS<List<Student>>();

                // 3. Ghi thông tin xuống files *.DAT
                boolean bFlag = false;
                try {
                    bFlag = objController.WriteListObjects(lisStudent, ParentPath, FileName);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }

                if (bFlag) {
                    JOptionPane.showMessageDialog(getParent(), "Đã ghi files tại: [" + ParentPath + FileName + "]");
                } else {
                    JOptionPane.showMessageDialog(getParent(), "Ghi files thất bại!");
                }
            }
        });
        btnGhiTT.setFont(new Font("Cambria", Font.PLAIN, 14));
        btnGhiTT.setBackground(Color.ORANGE);
        btnGhiTT.setBounds(166, 11, 219, 37);
        contentPane.add(btnGhiTT);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10, 59, 505, 328);
        contentPane.add(scrollPane);

        jtbLoadData = new JTable();
        scrollPane.setViewportView(jtbLoadData);
    }
}
